home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-06-19 | 2.9 KB | 124 lines | [TEXT/CWIE] |
- /*
- Problem 01 - Mode Sort
-
- This problem is to sort an input string of N characters, N<1000000, based on
- the number of times a character occurs in the input. The most frequently
- occurring character should be sorted to the front of the string, followed by
- the next most frequently occurring character, etc. For characters occurring
- the same number of times, the character that occurs first in the input should
- be sorted to the front.
-
- Header specification
-
- pascal OSErr ModeSort( const FSSpec* infile, const FSSpec* outfile );
-
- Input specification
-
- The infile input file contains the characters. Input characters other than
- those printable low ascii characters c, 0x20<c<0x7f, must be ignored.
-
- Output specification
-
- The outfile must be created and then filled with the sorted characters. It's
- final length should be exactly the same as the count of characters in the
- allowed range (0x20<c<0x7f) (which may be shorter than the infile file length).
-
- Sample input
-
- abcdefghabbcccdddeee
- or
- 012345678911234567892123456789312345678941234567895123456789612345678971234567891
-
- Sample output
-
- ccccddddeeeebbbaafgh
- or
- 111111111122222222233333333344444444455555555566666666677777777788888888999999990
- */
-
- #include "Solution.h"
- #include <algorithm>
-
- // Fill in your solution and then submit this folder
-
- // Team Name: Three and one!
-
- struct CharacterWithFrequency {
- unsigned char character;
- unsigned frequency;
- bool operator <(const CharacterWithFrequency& other) const;
- };
- __MSL_FIX_ITERATORS__(CharacterWithFrequency);
-
- static CharacterWithFrequency table[256];
-
- bool
- CharacterWithFrequency::operator <(const CharacterWithFrequency& other) const
- {
- return frequency > other.frequency;
- }
-
- static void
- SetUpCharacters()
- {
- for (unsigned index = 0; index < 256; index++) {
- table[index].character = index;
- table[index].frequency = 0;
- }
- }
-
- static OSErr
- ReadCharacters(short inRefNum)
- {
- while (1) {
- long count = 1;
- unsigned char character;
- OSErr error = FSRead(inRefNum, &count, &character);
- if (error == eofErr)
- return noErr;
- if (error != noErr)
- return error;
- if (character <= 0x20 || character >= 0x7F)
- continue;
- table[character].frequency += 1;
- }
- }
-
- static OSErr
- WriteCharacters(short outRefNum)
- {
- std::sort(&table[0], &table[256]);
-
- for (unsigned index = 0; index < 256; index++) {
- while (table[index].frequency != 0) {
- long count = 1;
- OSErr error = FSWrite(outRefNum, &count, &table[index].character);
- if (error != noErr)
- return error;
- table[index].frequency -= 1;
- }
- }
- return noErr;
- }
-
- pascal OSErr ModeSort( const FSSpec* infile, const FSSpec* outfile)
- {
- OSErr error;
- short inRefNum;
- error = FSpOpenDF(infile, fsRdPerm, &inRefNum);
- if (error != noErr)
- return error;
-
- short outRefNum;
- error = FSpCreate(outfile, 'CWIE', 'TEXT', 0);
- error = FSpOpenDF(outfile, fsCurPerm, &outRefNum);
- if (error != noErr)
- return error;
-
- SetUpCharacters();
- error = ReadCharacters(inRefNum);
- if (error != noErr)
- return error;
- return WriteCharacters(outRefNum);
- }
-